﻿#define _CRT_SECURE_NO_WARNINGS 1

class Solution {
public:
    int divi(int a, int b)
    {
        if (a > b)//注意原本是a < b，但是转为负数，所以符号也变了
        {
            return 0;
        }
        int result = 1;
        int step = b;
        while (a - step <= step)//18 / 4   先1个step、2个、4个 ， 18 - 16 = 2 ，2再去调用另外循环，从1个开始  
        {                      
            result += result;//双倍增长
            step += step;//双倍增长
        }
        return result + divi(a - step, b);
    }
    int divide(int dividend, int divisor)
    {
        if (divisor == 1)//处理特殊情况
            return dividend;
        if (dividend == INT_MIN && divisor == -1)//比如char类型，-128~127，-128/-1 = 128，但是最大值是127，所以返回127，int类型也是类似
            return INT_MAX;
        if (dividend == 0)
            return 0;
        bool flag = 0;
        if (dividend > 0)//都转为负数，方便计算
        {
            dividend = -dividend;
            flag = !flag;
        }
        if (divisor > 0)
        {
            divisor = -divisor;
            flag = !flag;
        }
        return flag ? -divi(dividend, divisor) : divi(dividend, divisor);
    }
};

/*
给你两个整数，被除数 dividend 和除数 divisor。将两数相除，要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断，也就是截去（truncate）其小数部分。例如，8.345 将被截断为 8 ，-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的 商 。

注意：假设我们的环境只能存储 32 位 有符号整数，其数值范围是 [−231,  231 − 1] 。本题中，如果商 严格大于 231 − 1 ，则返回 231 − 1 ；如果商 严格小于 -231 ，则返回 -231 。

示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ，向零截断后得到 3 。
*/

